package localhost.mb;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import localhost.ejb.DaoOrcamento;
import localhost.model.Categoria;
import localhost.model.Conta;
import localhost.model.Movimento;
import localhost.view.MessageBean;
import localhost.view.PageTransitionBean;
import localhost.view.ViewEntrada;

@ManagedBean(name = "mbEntrada")
@SessionScoped
public class MbEntrada {

	@EJB
	DaoOrcamento daoOrca;

	private ViewEntrada tela = new ViewEntrada();
	PageTransitionBean pt = new PageTransitionBean();
	MessageBean mb = new MessageBean();
	MetodosComuns mc = new MetodosComuns();
	FacesContext fc = FacesContext.getCurrentInstance();

	Date dataAlteracao = new Date();
	NumberFormat formatoMoeda = NumberFormat.getCurrencyInstance();

	public void novaEntrada() {
		Movimento ent = this.tela.getEntrada();
		int cat = this.tela.getIdCatSelecionado();
		int contaId = this.tela.getIdContaSelecionado();
		Categoria categoria = daoOrca.retornaCategoria(cat);
		Conta conta = daoOrca.retornaConta(contaId);
		alteraSaldoConta(conta, ent.getValor());
		ent.setConta(conta);
		ent.setTipo("E");
		ent.setCategoria(categoria);
		try {
			daoOrca.salvar(ent);
			msgRetornoGeral("frmIndex", "Entrada salva com êxito!");
			limparVariaveisTela();
		} catch (Exception e) {
			msgRetornoGeral("frmIndex",
					"Não foi possível realizar ação: Salvar!");
			e.printStackTrace();
		}
		populaListaEntradas();
	}

	public void alteraSaldoConta(Conta conta, Double valor) {
		Double valorIni = conta.getSaldo();
		Double valorFim = valorIni + valor;
		conta.setSaldo(valorFim);
		System.out.println("SaldoIni: " + valorIni);
		System.out.println("Entrada: " + valor);
		System.out.println("SaldoFim: " + valorFim);
		try {
			daoOrca.atualizar(conta);
		} catch (Exception e) {
			System.out.println("Erro ao atualizar saldo conta "
					+ conta.getDescricao());
			e.printStackTrace();
		}
	}

	public void excluir(Movimento ent) {

		try {
			daoOrca.excluiMovimento(ent);
			msgRetornoGeral("frmIndex", "Entrada excluída com êxito!");
			this.tela.setVisibilidadeButton(false);
			limparVariaveisTela();
		} catch (Exception e) {
			msgRetornoGeral("frmIndex",
					"Não foi possível realizar ação: Excluir!");
			e.printStackTrace();
		}
		populaListaEntradas();

	}

	public void limparVariaveisTela() {
		this.tela.setEntrada(new Movimento());
		this.tela.setIdCatSelecionado(0);
		this.tela.setIdContaSelecionado(0);
	}

	public String montaTelaInicial() {
		this.tela.setVisibilidadeButton(false);
		limparVariaveisTela();
		populaListaEntradas();
		populaSelectCategorias();
		populaSelectContas();
		return pt.chamaEntrada();
	}

	public void montaTelaEditar(Movimento ent) {
		this.tela.setVisibilidadeButton(true);
		this.tela.setEntrada(ent);
		this.tela.setIdCatSelecionado(ent.getCategoria().getId());
		this.tela.setIdContaSelecionado(ent.getConta().getId());
	}

	public void alteraEntrada() {
		Movimento ent = this.tela.getEntrada();
		int cat = this.tela.getIdCatSelecionado();
		int contaId = this.tela.getIdContaSelecionado();
		Categoria categoria = daoOrca.retornaCategoria(cat);
		Conta conta = daoOrca.retornaConta(contaId);
		ent.setConta(conta);
		ent.setCategoria(categoria);

		try {
			daoOrca.atualizar(ent);
			this.tela.setVisibilidadeButton(false);
			limparVariaveisTela();
			msgRetornoGeral("frmIndex", "Entrada alterada com êxito!");
		} catch (Exception e) {
			msgRetornoGeral("frmIndex",
					"Não foi possível realizar ação: Alterar!");
			e.printStackTrace();
		}
		populaListaEntradas();

	}

	public void populaListaEntradas() {
		List<Movimento> entradas = daoOrca.listaEntradas();
		System.out.println("Total entradas: " + entradas.size());
		this.tela.setEntradas(entradas);
	}

	public void populaSelectCategorias() {
		List<Categoria> categorias = daoOrca.listaCategoriasEntrada();
		List<SelectItem> selectI = new ArrayList<SelectItem>();
		for (Categoria cat : categorias) {
			selectI.add(new SelectItem(cat.getId(), cat.getDescricao()));
		}

		System.out.println("Total categorias: " + categorias.size());
		System.out.println("Total select categorias: " + selectI.size());

		this.tela.setSelectCategorias(selectI);
	}

	public void populaSelectContas() {
		List<Conta> contas = daoOrca.listaContas();
		List<SelectItem> selectI = new ArrayList<SelectItem>();
		for (Conta conta : contas) {
			selectI.add(new SelectItem(conta.getId(), conta.getDescricao()));
		}

		System.out.println("Total contas: " + contas.size());
		System.out.println("Total select contas: " + selectI.size());

		this.tela.setSelectContas(selectI);
	}

	public ViewEntrada getTela() {
		return tela;
	}

	public void setTela(ViewEntrada tela) {
		this.tela = tela;
	}

	// ############################ MENSAGENS #############################
	public void msgRetornoGeral(String idComp, String msg) {
		mb.addMessageSemBundle(msg, idComp, FacesMessage.SEVERITY_WARN);
	}

}